﻿
namespace HtmlParser.Dom
{
    internal class XmlLoader
    {
        private XmlDocument doc;
        private bool preserveWhitespace;

        #region
        //private XmlReader reader;

        //private XmlReader CreateInnerXmlReader(string xmlFragment, XmlNodeType nt, XmlDocument doc)
        //{
        //    XmlNodeType fragType = nt;
        //    switch (fragType)
        //    {
        //        case XmlNodeType.Entity:
        //        case XmlNodeType.EntityReference:
        //            fragType = XmlNodeType.Element;
        //            break;
        //    }
        //    //XmlTextReaderImpl tr = new XmlTextReaderImpl(xmlFragment, fragType, context)
        //    //{
        //    //    XmlValidatingReaderCompatibilityMode = true
        //    //};
        //    //if (doc.HasSetResolver)
        //    //{
        //    //    tr.XmlResolver = doc.GetResolver();
        //    //}
        //    //if (!doc.ActualLoadingStatus)
        //    //{
        //    //    tr.DisableUndeclaredEntityCheck = true;
        //    //}
        //    //XmlDocumentType documentType = doc.DocumentType;
        //    //if (documentType != null)
        //    //{
        //    //    tr.Namespaces = documentType.ParseWithNamespaces;
        //    //    if (documentType.DtdSchemaInfo != null)
        //    //    {
        //    //        tr.DtdSchemaInfo = documentType.DtdSchemaInfo;
        //    //    }
        //    //    else
        //    //    {
        //    //        SchemaInfo info = DtdParser.Parse(tr, context.BaseURI, context.DocTypeName, context.PublicId, context.SystemId, context.InternalSubset);
        //    //        documentType.DtdSchemaInfo = info;
        //    //        tr.DtdSchemaInfo = info;
        //    //    }
        //    //}
        //    //if ((nt == XmlNodeType.Entity) || (nt == XmlNodeType.EntityReference))
        //    //{
        //    //    tr.Read();
        //    //    tr.ResolveEntity();
        //    //}
        //    //return tr;
        //}
        #endregion

        internal void ParseDocumentType(XmlDocumentType dtNode)
        {
            XmlDocument ownerDocument = dtNode.OwnerDocument;
            if (ownerDocument.HasSetResolver)
            {
                this.ParseDocumentType(dtNode, true);
            }
            else
            {
                this.ParseDocumentType(dtNode, false);
            }
        }

        #region 根据字符串得到Attribute
        internal void LoadInnerXmlAttribute(XmlAttribute node, string innerxmltext)
        {
            //this.ParsePartialContent(node, innerxmltext, XmlNodeType.Attribute);
        }
        //internal XmlNamespaceManager ParsePartialContent(XmlNode parentNode, string innerxmltext, XmlNodeType nt)
        //{
        //    this.doc = parentNode.OwnerDocument;
        //    XmlParserContext context = this.GetContext(parentNode);
        //    this.reader = this.CreateInnerXmlReader(innerxmltext, nt, context, this.doc);
        //    try
        //    {
        //        this.preserveWhitespace = true;
        //        bool isLoading = this.doc.IsLoading;
        //        this.doc.IsLoading = true;
        //        if (nt == XmlNodeType.Entity)
        //        {
        //            XmlNode newChild = null;
        //            while (this.reader.Read() && ((newChild = this.LoadNodeDirect()) != null))
        //            {
        //                parentNode.AppendChildForLoad(newChild, this.doc);
        //            }
        //        }
        //        else
        //        {
        //            XmlNode node2 = null;
        //            while (this.reader.Read() && ((node2 = this.LoadNode(true)) != null))
        //            {
        //                parentNode.AppendChildForLoad(node2, this.doc);
        //            }
        //        }
        //        this.doc.IsLoading = isLoading;
        //    }
        //    finally
        //    {
        //        this.reader.Close();
        //    }
        //    return context.NamespaceManager;
        //}
        #endregion

        #region 根据字符串处理子内容
        //internal XmlNamespaceManager ParsePartialContent(XmlNode parentNode, string innerxmltext, XmlNodeType nt)
        internal void ParsePartialContent(XmlNode parentNode, string innerxmltext, XmlNodeType nt)
        {
            //this.doc = parentNode.OwnerDocument;
            //XmlParserContext context = this.GetContext(parentNode);
            //this.reader = this.CreateInnerXmlReader(innerxmltext, nt, context, this.doc);
            //try
            //{
            //    this.preserveWhitespace = true;
            //    bool isLoading = this.doc.IsLoading;
            //    this.doc.IsLoading = true;
            //    if (nt == XmlNodeType.Entity)
            //    {
            //        XmlNode newChild = null;
            //        while (this.reader.Read() && ((newChild = this.LoadNodeDirect()) != null))
            //        {
            //            parentNode.AppendChildForLoad(newChild, this.doc);
            //        }
            //    }
            //    else
            //    {
            //        XmlNode node2 = null;
            //        while (this.reader.Read() && ((node2 = this.LoadNode(true)) != null))
            //        {
            //            parentNode.AppendChildForLoad(node2, this.doc);
            //        }
            //    }
            //    this.doc.IsLoading = isLoading;
            //}
            //finally
            //{
            //    this.reader.Close();
            //}
            //return context.NamespaceManager;
        }
        #endregion

        private void ParseDocumentType(XmlDocumentType dtNode, bool bUseResolver)
        {
            //this.doc = dtNode.OwnerDocument;
            //XmlNameTable nameTable = this.doc.NameTable;
            //XmlNamespaceManager nsManager = new XmlNamespaceManager(nameTable);
            //SchemaInfo schInfo = DtdParser.Parse(nameTable, nsManager, dtNode.ParseWithNamespaces, this.doc.BaseURI, dtNode.Name, dtNode.PublicId, dtNode.SystemId, dtNode.InternalSubset, bUseResolver, resolver);
            //this.LoadDocumentType(schInfo, dtNode);
        }

        //internal void ExpandEntity(XmlEntity ent)
        //{
        //    this.ParsePartialContent(ent, this.EntitizeName(ent.Name), XmlNodeType.Entity);
        //}
        //internal XmlNamespaceManager ParsePartialContent(XmlNode parentNode, string innerxmltext, XmlNodeType nt)
        //{
        //    this.doc = parentNode.OwnerDocument;
        //    XmlParserContext context = this.GetContext(parentNode);
        //    this.reader = this.CreateInnerXmlReader(innerxmltext, nt, context, this.doc);
        //    try
        //    {
        //        this.preserveWhitespace = true;
        //        bool isLoading = this.doc.IsLoading;
        //        this.doc.IsLoading = true;
        //        if (nt == XmlNodeType.Entity)
        //        {
        //            XmlNode newChild = null;
        //            while (this.reader.Read() && ((newChild = this.LoadNodeDirect()) != null))
        //            {
        //                parentNode.AppendChildForLoad(newChild, this.doc);
        //            }
        //        }
        //        else
        //        {
        //            XmlNode node2 = null;
        //            while (this.reader.Read() && ((node2 = this.LoadNode(true)) != null))
        //            {
        //                parentNode.AppendChildForLoad(node2, this.doc);
        //            }
        //        }
        //        this.doc.IsLoading = isLoading;
        //    }
        //    finally
        //    {
        //        this.reader.Close();
        //    }
        //    return context.NamespaceManager;
        //}

    }
}
